package controller;

import java.util.Vector;

import vo.AlumnoVO;
import vo.CursoVO;
import vo.MateriaVO;
import vo.ProfesorVO;
import negocio.Alumno;
import negocio.Curso;
import negocio.Direccion;
import negocio.Materia;
import negocio.Profesor;

public class Controller {
	private static Controller instancia;
	private Vector<Alumno> alumnos;
	private Vector<Materia> materias;
	private Vector<Profesor> profesores;
	private Vector<Curso> cursos;

	private Controller() {
		this.alumnos = new Vector<Alumno>();
		this.materias = new Vector<Materia>();
		this.profesores = new Vector<Profesor>();
		this.cursos = new Vector<Curso>();
	}
	
	public Controller getController(){
		if(instancia == null){
			instancia = new Controller();
		}
		return instancia;
	}
	
	public void agregarAlumno(AlumnoVO alumno){
		if(alumno == null){
			throw new NullPointerException("Alumno null");
		}
		if(!existeAlumnoByLegajo(alumno.legajo)){
			this.alumnos.add(new Alumno(alumno.legajo, alumno.nombre, alumno.estado));
		}
	}
	
	public void agregarMateria(MateriaVO materia){
		if(materia == null){
			throw new NullPointerException("Materia null");
		}
		if(!existeMateriaByNumero(materia.numero)){
			this.materias.add(new Materia(materia.numero, materia.nombre));
		}
	}
	
	public void agregarProfesor(ProfesorVO profesor){
		if(profesor == null){
			throw new NullPointerException("Profesor null");
		}
		if(!existeProfesorByLegajo(profesor.numeroLegajo)){
			Direccion direccion = new Direccion(profesor.direccion.calle, profesor.direccion.numero,
												profesor.direccion.cp, profesor.direccion.localidad,
												profesor.direccion.piso, profesor.direccion.depto);
			Vector<Materia> materias = new Vector<Materia>();
			for(int i=0; i<profesor.materias.size(); i++){
				MateriaVO materiaVO = profesor.materias.elementAt(i);
				Materia materia = new Materia(materiaVO.numero, materiaVO.nombre);
				materias.add(materia);
			}
			this.profesores.add(new Profesor(profesor.numeroLegajo, profesor.nombre, direccion, materias));
		}
	}
	
	public void elimiarAlumno(int legajo){
		for(int i=0; i<this.alumnos.size(); i++){
			if(this.alumnos.elementAt(i).getLegajo() == legajo){
				this.alumnos.remove(i);
			}
		}
	}
	
	public void elimiarMateria(int numero){
		for(int i=0; i<this.materias.size(); i++){
			if(this.materias.elementAt(i).getNumero() == numero){
				this.materias.remove(i);
			}
		}
	}
	
	public void elimiarProfesor(int numeroLegajo){
		for(int i=0; i<this.profesores.size(); i++){
			if(this.profesores.elementAt(i).getNumeroLegajo() == numeroLegajo){
				this.profesores.remove(i);
			}
		}
	}
	
	public Alumno obtenerAlumnoPorLegajo(int legajo){
		for(int i=0; i<this.alumnos.size(); i++){
			if(this.alumnos.elementAt(i).getLegajo() == legajo){
				return this.alumnos.elementAt(i);
			}
		}
		return null;
	}
	
	public Materia obtenerMateriaPorNumero(int numero){
		for(int i=0; i<this.materias.size(); i++){
			if(this.materias.elementAt(i).getNumero() == numero){
				return this.materias.elementAt(i);
			}
		}
		return null;
	}
	
	public Profesor obtenerProfesorPorLegajo(int numeroLegajo){
		for(int i=0; i<this.profesores.size(); i++){
			if(this.profesores.elementAt(i).getNumeroLegajo() == numeroLegajo){
				return this.profesores.elementAt(i);
			}
		}
		return null;
	}
	
	public Curso obtenerCursoPorNumerador(int numerador){
		for(int i=0; i<this.cursos.size(); i++){
			if(this.cursos.elementAt(i).getNumerador() == numerador){
				return this.cursos.elementAt(i);
			}
		}
		return null;
	}
	
	public Vector<AlumnoVO> obtenerAlumnos(){
		Vector<AlumnoVO> alumnosVO = new Vector<AlumnoVO>();
		for(int i=0; i<this.alumnos.size(); i++){
			alumnosVO.add(this.alumnos.elementAt(i).asVO());
		}
		return alumnosVO;
	}
	
	public Vector<MateriaVO> obtenerMaterias(){
		Vector<MateriaVO> materiasVO = new Vector<MateriaVO>();
		for(int i=0; i<this.materias.size(); i++){
			materiasVO.add(this.materias.elementAt(i).asVO());
		}
		return materiasVO;
	}
	
	public Vector<ProfesorVO> obtenerProfesores(){
		Vector<ProfesorVO> profesoresVO = new Vector<ProfesorVO>();
		for(int i=0; i<this.profesores.size(); i++){
			profesoresVO.add(this.profesores.elementAt(i).asVO());
		}
		return profesoresVO;
	}
	
	public void nuevoCurso(MateriaVO materiaVO, ProfesorVO profesorVO, int cantidadMaxima){
		if(materiaVO == null || profesorVO == null){
			throw new NullPointerException("Null");
		}
		Materia materia = new Materia(materiaVO.numero, materiaVO.nombre);
		Direccion direccion = new Direccion(profesorVO.direccion.calle, profesorVO.direccion.numero, 
											profesorVO.direccion.cp, profesorVO.direccion.localidad, 
											profesorVO.direccion.piso, profesorVO.direccion.depto);
		Vector<Materia> materiasProf = new Vector<Materia>();
		for(int i=0; i<profesorVO.materias.size(); i++){
			materiasProf.add(new Materia(profesorVO.materias.elementAt(i).numero, profesorVO.materias.elementAt(i).nombre));
		}
		Profesor profesor = new Profesor(profesorVO.numeroLegajo, profesorVO.nombre, 
										 direccion, materiasProf);
		
		Curso curso = new Curso(0, 0, materia, profesor, cantidadMaxima);
		this.cursos.add(curso);
	}
	
	public void eliminarCurso(CursoVO curso){
		for(int i=0; i<this.cursos.size(); i++){
			if(this.cursos.elementAt(i).getNumerador() == curso.numerador){
				this.cursos.remove(i);
			}
		}
	}
	
	public void asignarMateriaProfesor(MateriaVO materia, ProfesorVO profesorVO){
		Profesor profesor = this.obtenerProfesorPorLegajo(profesorVO.numeroLegajo);
		profesor.agregarMateria(materia);
	}
	
	public void asignarAlumnoCurso(CursoVO cursoVO, AlumnoVO alumno){
		Curso curso = this.obtenerCursoPorNumerador(cursoVO.numerador);
		curso.agregarAlumno(alumno);
	}
	
	private boolean existeAlumnoByLegajo(int legajo){
		for(int i=0; i<this.alumnos.size(); i++){
			if(this.alumnos.elementAt(i).getLegajo() == legajo){
				return true;
			}
		}
		return false;
	}
	
	private boolean existeMateriaByNumero(int numero){
		for(int i=0; i<this.materias.size(); i++){
			if(this.materias.elementAt(i).getNumero() == numero){
				return true;
			}
		}
		return false;
	}
	
	private boolean existeProfesorByLegajo(int numeroLegajo){
		for(int i=0; i<this.profesores.size(); i++){
			if(this.profesores.elementAt(i).getNumeroLegajo() == numeroLegajo){
				return true;
			}
		}
		return false;
	}
}
